/*
 * @Author: dadadaXU 1413107032@qq.com
 * @Date: 2024-10-16 16:08:49
 * @LastEditors: dadadaXU 1413107032@qq.com
 * @LastEditTime: 2025-01-04 15:24:57
 * @FilePath: /FileBackup/include/Packer.hpp
 * @Description: 文件Tar方式打包解包
 * -
 */
#pragma once

#include "fileBaseUnit.hpp"
#include <fstream>
#include <unordered_map>

#ifndef MAX_DIR_DEPTH
#define MAX_DIR_DEPTH 10 // 目录遍历深度
#endif

class FilePacker
{
private:
    std::filesystem::path originalWorkPath; // 程序原始工作目录
    std::filesystem::path sourceFilePath;   // 打包原文件目录   绝对路径
    std::filesystem::path targetFilePath;   // 打包文件目标目录 绝对路径

    FileFilterArguments fileFilterArguments; // 对文件进行过滤的参数

    std::unordered_map<ino_t, std::filesystem::path> inodeTable; // 检测文件链接情况

    /// @brief 先序遍历目录树
    /// @param package 打包文件流
    /// @param path 根结点路径
    /// @param level 限制遍历深度，防止死循环
    void PreorderEnumerate(FileBaseUnit &package, std::filesystem::path path, int level = 0);

public:
    /// @brief 文件打包
    /// @param filter_arguments 文件过滤参数
    /// @param message 打包备注信息
    void PackFile(const FileFilterArguments filter_arguments, const std::string message);

    /// @brief 文件解包
    /// @param restore_metadata 恢复文件元数据
    /// @param go_back 恢复文件原路径
    /// @return 解包成功 `true`
    bool UnpackFile(bool restore_metadata, bool go_back);

    /// @brief 文件Tar方式打包解包
    /// @param source_file_path 打包原文件目录
    /// @param target_pack_path 打包文件目标目录
    FilePacker(std::filesystem::path source_file_path,
               std::filesystem::path target_file_path);
    ~FilePacker();
};
